home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 2 / Atari Mega Archive CD - Volume 2.iso / 8bit / cislib_a / life5.act < prev    next >
Text File  |  1995-04-22  |  7KB  |  303 lines

  1. BYTE XMAIN,YMAIN,LIVECOL=708,      
  2.      DEATHCOL=709,BIRTHCOL=710, 
  3.      CONSOL=53279 
  4.  
  5. CARD ARRAY LINEPT(40) 
  6.  
  7. PROC GR5INIT() 
  8. ;INITIALIZE A GR. 5 SCREEN.  WE MUST  
  9. ;DO THIS TO UTILIZE THE SPECIAL PLOT 
  10. ;ROUTINES WHICH I STOLE FROM AN     
  11. ;OLD ANALOG MAGAZINE. 
  12.    CARD SCRN=88 
  13.    BYTE LINE 
  14.  
  15.    GRAPHICS(5) 
  16.    FOR LINE=0 TO 39 DO 
  17.      LINEPT(LINE)=SCRN+20*LINE 
  18.    OD 
  19.    LIVECOL=8    
  20. RETURN 
  21.  
  22. PROC PLOT5(BYTE X,Y,COL) 
  23. ;HERE IS THE STOLEN PLOT ROUTINE. IT 
  24. ;IS MUCH FASTER THAN THE OS ROUTINES, 
  25. ;BUT IT DOES NO CHECKING FOR ILLEGAL 
  26. ;VALUES. IT IS EASILY ADAPTABLE FOR 
  27. ;GR. 7 USE. 
  28.    BYTE POINTER PIXEL 
  29.    BYTE ARRAY COLFIL=[0 85 170 255], 
  30.               MASK=[63 207 243 252], 
  31.               MASK2=[192 48 12 3] 
  32.  
  33.    PIXEL=LINEPT(Y)+(X RSH 2) 
  34.    PIXEL^=PIXEL^&MASK(X&3) 
  35.                 % (COLFIL(COL) &  
  36.                 MASK2(X & 3)) 
  37. RETURN 
  38.  
  39. BYTE FUNC LOCATE5(BYTE X,Y) 
  40. ;HERE'S ANOTHER STOLEN ROUTINE. AGAIN 
  41. ;IT IS MUCH FASTER THAN OS ROUTINES, 
  42. ;BUT DOES NO TESTS FOR ILLEGAL VALUES. 
  43.    BYTE POINTER PIXEL 
  44.    BYTE ARRAY MASK=[192 48 12 3] 
  45.  
  46.    PIXEL=LINEPT(Y)+(X RSH 2) 
  47. RETURN ((PIXEL^ & MASK(X & 3)) RSH 
  48.         (((X & 3) XOR 3) LSH 1)) 
  49.  
  50. PROC PAUZ(CARD X) 
  51. ;A SIMPLE ROUTINE TO DO NOTHING FOR A 
  52. ;GIVEN PERIOD OF TIME. 
  53.    CARD LOOP 
  54.  
  55.    FOR LOOP=1 TO X DO 
  56.    OD 
  57. RETURN 
  58.  
  59. PROC PUTDOTS() 
  60. ;THIS ROUTINE READS THE JOYSTICK AND 
  61. ;MOVES A BLINKING CURSOR AROUND THE 
  62. ;SCREEN.  A CELL IS ACTIVATED IF 
  63. ;ONE ISN'T THERE, AND DEACTIVATED IF 
  64. ;IT IS THERE. 
  65.    BYTE XPOS=[39],YPOS=[18],STIK=632, 
  66.         STRIG=644,HOLD,NEXTX,NEXTY, 
  67.         XLP,YLP 
  68.          
  69.    BYTE ARRAY DELTAX = [0 0 0 0 0 1 1 
  70.                         1 0 255 255  
  71.                         255 0 0 0 0], 
  72.               DELTAY = [0 0 0 0 0 1 
  73.                         255 0 0 1 255 
  74.                         0 0 1 255 0] 
  75.  
  76.    DEATHCOL=14 
  77.    HOLD=LOCATE5(XPOS,YPOS) 
  78.    PRINTE("JOYSTICK BUTTON TO PLACE OR ERASE") 
  79.    PRINTE("PUSH OPTION & SELECT TO CLEAR SCREEN") 
  80.    PRINTE("PUSH START TO START") 
  81.    DO 
  82.      PLOT5(XPOS,YPOS,2) 
  83.      PAUZ(2000) 
  84.      IF STRIG=0 AND HOLD=1           
  85.         THEN HOLD=0 
  86.              SOUND(0,121,10,8) 
  87.              PAUZ(4000)  
  88.              SNDRST() 
  89.      ELSEIF STRIG=0 AND HOLD=0      
  90.         THEN HOLD=1 
  91.              SOUND(0,29,10,8) 
  92.              PAUZ(2000) 
  93.              SNDRST() 
  94.      FI 
  95.      NEXTX=XPOS+DELTAX(STIK) 
  96.      NEXTY=YPOS+DELTAY(STIK) 
  97.      IF NEXTX<>XPOS OR NEXTY<>YPOS 
  98.         THEN PLOT5(XPOS,YPOS,HOLD) 
  99.              XPOS=NEXTX 
  100.              IF XPOS>75  
  101.                 THEN XPOS=4 
  102.              ELSEIF XPOS<4 
  103.                 THEN XPOS=75  
  104.              FI 
  105.              YPOS=NEXTY 
  106.              IF YPOS>38 
  107.                 THEN YPOS=1 
  108.              ELSEIF YPOS<1 
  109.                 THEN YPOS=38 
  110.              FI 
  111.              SOUND(0,60,10,8)     
  112.              PAUZ(2000) 
  113.              SNDRST() 
  114.              HOLD=LOCATE(XPOS,YPOS) 
  115.      FI 
  116.      PAUZ(2000) 
  117.      IF CONSOL=1 
  118.         THEN HOLD=0 
  119.              FOR YLP=1 TO 38 DO 
  120.                FOR XLP=1 TO 18 DO 
  121.                  POKE(LINEPT(YLP)+XLP,0) 
  122.                OD 
  123.              OD 
  124.      FI 
  125.      UNTIL CONSOL=6 
  126.    OD 
  127.    PLOT5(XPOS,YPOS,HOLD) 
  128. RETURN 
  129.  
  130. PROC PIXELCHEK(BYTE XB,Y) 
  131. ;THIS ROUTINE CHECKS ALL THE PIXELS 
  132. ;IN THE BYTE OF SCREEN MEMORY PASSED 
  133. ;TO IT FOR BIRTH OR DEATH.  IF A      
  134. ;PIXEL IS EMPTY AND HAS THREE LIVE 
  135. ;NEIGHBORS A BIRTH WILL OCCUR IN THE 
  136. ;NEXT GENERATION.  IF A PIXEL IS LIVE 
  137. ;AND HAS MORE THAN THREE LIVE  
  138. ;NEIGHBORS IT WILL DIE IN THE NEXT  
  139. ;GENERATION. 
  140.  
  141.    BYTE LPX,LPY,LP,X,COUNT=[0],HOLD 
  142.   
  143. ;CONVERT X BYTE VALUE TO A PIXEL AND 
  144. ;CHECK ITS EIGHT NEIGHBORS. 
  145.  
  146. ;MULTIPLY BY FOUR FOR PIXEL VALUE. 
  147.    X=XB LSH 2            
  148.  
  149. ;CHECK FIRST PIXEL AND THE THREE 
  150. ;WHICH FOLLOW IT. 
  151.    FOR LP=X TO X+3 DO 
  152.  
  153. ;CHECK THE EIGHT SURROUNDING PIXELS. 
  154.      FOR LPY=Y-1 TO Y+1 DO 
  155.        FOR LPX=LP-1 TO LP+1 DO 
  156.          HOLD=LOCATE5(LPX,LPY) 
  157.          IF HOLD=1 OR HOLD=2   
  158.             THEN COUNT==+1 
  159.          FI 
  160.        OD 
  161.      OD 
  162.  
  163. ;THESE ARE THE POSSIBLE CASES OF  
  164. ;BIRTH AND DEATH.  WE ADD ONE IF HOLD 
  165. ;IS ONE BECAUSE WE COUNTED IT IN THE 
  166. ;SEARCH OF THE SURROUNDING PIXELS. 
  167. ;IF A DEATH IS TO OCCUR WE RESET THE 
  168. ;PIXEL COLOR TO COLOR 2.  IT IS  
  169. ;VISIBLE, BUT MARKED FOR DEATH IN THE 
  170. ;NEXT GENERATION. 
  171. ;IF A BIRTH IS TO OCCUR WE RESET THE 
  172. ;PIXEL COLOR TO THREE.  IT IS   
  173. ;INVISIBLE, BUT MARKED FOR BIRTH IN 
  174. ;THE NEXT GENERATION. 
  175.  
  176.      HOLD=LOCATE5(LP,Y) 
  177.      IF HOLD=1                
  178.         AND (COUNT<3 OR COUNT>4) 
  179.         THEN PLOT5(LP,Y,2) 
  180.      ELSEIF HOLD=0            
  181.         AND COUNT=3 
  182.         THEN PLOT5(LP,Y,3) 
  183.      FI 
  184.      COUNT=0 
  185.    OD 
  186. RETURN 
  187.  
  188. PROC CHEKBYTE() 
  189. ;THIS ROUTINE DOES A CHECK ON EACH 
  190. ;SCREEN BYTE AND ITS FOUR ORTHOGONAL 
  191. ;NEIGHBORS.  IF ANY OF THESE ARE  
  192. ;GREATER THAN ZERO IT CALLS PIXELCHEK 
  193. ;TO CHECK THE INDIVIDUAL PIXELS OF 
  194. ;THE BYTE.  THIS SAVES TIME FOR EACH 
  195. ;PASS, SINCE BYTE OPERATIONS ARE SO 
  196. ;MUCH FASTER THAN PIXEL OPERATIONS. 
  197. ;THERE COULD BE ROOM FOR IMPROVEMENT 
  198. ;IN THIS ROUTINE. 
  199.  
  200.    BYTE XLP,YLP 
  201.    BYTE POINTER XBYTE,XPLUS,XMINUS, 
  202.                 YPLUS,YMINUS 
  203. ;YLP=NUMBER OF ROWS IN A GR.5 SCREEN. 
  204. ;XLP=NUMBER OF BYTES IN EACH ROW 
  205. ;    (FOUR PIXELS TO THE BYTE). 
  206. ;XBYTE=POINTER TO BYTE BEING CHECKED 
  207. ;XPLUS=BYTE BEING CHECKED + 1 
  208. ;XMINUS=BYTE BEING CHECKED - 1 
  209. ;YPLUS=BYTE BELOW CURRENT BYTE 
  210. ;YMINUS=BYTE ABOVE CURRENT BYTE 
  211. ; I'M SO CONFUSED !!! 
  212.  
  213.    FOR YLP=1 TO 38 DO 
  214.      FOR XLP=1 TO 18 DO 
  215.        XBYTE=LINEPT(YLP)+XLP 
  216.        XPLUS=XBYTE+1 
  217.        XMINUS=XBYTE-1 
  218.        YPLUS=XBYTE+20  
  219.        YMINUS=XBYTE-20 
  220.  
  221.        IF YPLUS^>0 
  222.           THEN PIXELCHEK(XLP,YLP)   
  223.        ELSEIF (XPLUS^&$C0)>0  
  224.           THEN PIXELCHEK(XLP,YLP)  
  225.        ELSEIF XBYTE^ >0 
  226.           THEN PIXELCHEK(XLP,YLP) 
  227.        ELSEIF (XMINUS^&$03)>0  
  228.           THEN PIXELCHEK(XLP,YLP) 
  229.        ELSEIF YMINUS^ >0 
  230.           THEN PIXELCHEK(XLP,YLP) 
  231.        FI 
  232.      OD                          
  233.    OD 
  234. RETURN 
  235.  
  236. PROC RESETSCRN() 
  237. ;THIS ROUTINE MASKS ALL THE BYTES OF  
  238. ;SCREEN MEMORY WITH A HEX $55.  THIS 
  239. ;SETS ALL THE DEATH PIXELS TO 00 AND 
  240. ;ALL THE BIRTH PIXELS TO 01, WHILE 
  241. ;LEAVING THE STATIC CELLS UNHARMED. 
  242.  
  243.    BYTE X,Y,MASK=[$55],HOLD 
  244.    BYTE POINTER BPOINT 
  245.  
  246.    FOR Y=1 TO 38 DO 
  247.      BPOINT=LINEPT(Y) 
  248.      FOR X=1 TO 18 DO 
  249.        BPOINT^==&MASK          
  250.        BPOINT==+1       
  251.      OD 
  252.    OD 
  253. RETURN 
  254.  
  255. PROC PRINTINST() 
  256.    PRINTE("PRESS SELECT TO DRAW") 
  257.    PRINTE("PRESS OPTION TO QUIT") 
  258.    PRINTE(" ") 
  259. RETURN 
  260.  
  261. PROC MAIN() 
  262. ;THIS IS THE MAIN ROUTINE. IT  
  263. ;INITIALIZES THE SCREEN AND STARTS 
  264. ;CYCLING THROUGH THE GENERATIONS. 
  265. ;AFTER CHEKBYTE IS EXECUTED IT  
  266. ;CHANGES COLOR REGISTER VALUES TO  
  267. ;MAKE THE BIRTHS APPEAR AND THE 
  268. ;DEATHS DISAPPEAR.  IT THEN CALLS 
  269. ;RESETSCRN TO CLEAR OUT BIRTHS AND 
  270. ;DEATHS.  ALL THE WHILE IT LOOKS FOR 
  271. ;THE FUNCTION KEYS TO BE PRESSED TO 
  272. ;INVOKE THE CELL EDITOR OR TO END 
  273. ;THE PROGRAM. 
  274. ;                 ROBERT ROSENBACH 
  275. ;                 DECEMBER, 1986 
  276.  
  277.    GR5INIT() 
  278.    PRINTINST() 
  279.    DO 
  280.      IF CONSOL=5 
  281.         THEN PUTDOTS() 
  282.              PRINTINST() 
  283.      FI 
  284.      DEATHCOL=8 
  285.      BIRTHCOL=0 
  286.      CHEKBYTE() 
  287.      DEATHCOL=0 
  288.      BIRTHCOL=8 
  289.      SOUND(0,20,10,10) 
  290.      PAUZ(3000) 
  291.      SNDRST() 
  292.      RESETSCRN() 
  293.      IF CONSOL=3 
  294.         THEN EXIT 
  295.      FI 
  296.      POKE(77,0) 
  297.    OD 
  298. RETURN 
  299.  
  300.